[IMPORTANT: In this section you will learn that you can create new
TYPE and SUBTYPE. When DirMenu will search for actions, TYPE will be
searched first, and if not found, SUBTYPE will be searched for.]@{fg
text}
@{fg fill}[ Programmers files (sources, includes etc.) are not
included in Dir Menu archive. You can either get those from Aminet,
me, or their authors ]@{fg text}
@{b}1.Usage
2.User's documentation
3.Programmer's documentation
@{ub}
@{b}1)@{ub}
What is whatis.library ? It is a shared amiga library which alow
programmers to easyly recognize type of files (ilbm, 8svx, maxiplan,
exe, PP, etc....) BUT the final user (non-programer user) can define
new types so all programs which use whatis.library can recognize this
new type. At this moment only BrowserII, For and AddIcon use
whatis.library but I planned to rewrite Icon ( a program which make
WorkBench 2.0 recognize files which have no icon), and I encourage all
programmers to use this library so users can define new types only one
time and every program can use it. I actualy work on version which
support the datatype of KickStart 3.0 so user of whatis.library can
use both the customisable whatis type and the standard datatype type.
For example, you love graphics, you digitize lots of image with an
official commercial program which produce file ".img", and you want
BrowserII can reconised it, well, you define this new type in
S:FileTypes and whatis.library know what it is, so you BrowserII can
do automatic thing on your file ".img", but all program which use
whatis.library can reconised the ".img"-type you just defined and can
do what they are supposed to do with them.
List of type that whatis.library reconize without any S:FileType file:
DOS_DEVICE VOLU ME ASSIGN DIR EXECUTABLE EXECPP40 EXECPP30 EXECPP
SCRIPT TEXT OBJECT LIB IFF ILBM ILBM24 ANIM 8SVX SMUS FTXT PREFS TERM
ICON IMPDATA PPDATA ZOO LHARC MEDMOD
@{b}2)@{ub} Well, user. All you need is to know how to define a
new type. A sample/starter FileTypes file is provided. First, have a
look at it and then read what follows, I think there is not much to
There are 2 methods to scan a file: DEEP and LIGHT. The Light one is
only based on the file name and eventualy protection bits. It is fast
but unsafe. if you rename an executable as "File.c" and you ask for a
light scan (BrowserII with "find type by name"), WhatIs.library think
it is a C language source file. The DEEP one (currently only one DEEP
mode) is more powerfull, but the slowest because each file must be
open and the first few bytes scanned (currently 484 bytes), so this
slow down directory scans.
FileTypes syntax:
While not necessary, we recommand use of quotes (") delimiters for
strings to avoid mistakes. The # character can be found in strings
while it is the comment starting char. The "#" char marks the
begining of comment until end of ligne.
# example definition: TYPE "Src Ada" # you define a new type, it's
IDString (curently 9
# char max) is "Src Ada", this is the string that
# WhatIs.library will return and you can see in
# BrowserII when you ask the "Show file type", it
# is also the way you identify this FileType.
SUBTYPE "Text" # OPTIONNAL: First, the file MUST be a "Text" type,
# this means that if the file is not of this type
# it cannot be a "Src Ada"
INSERTAFTER "Script" # OPTIONNAL: You want the type "Src Ada" to be
# put after the "Script" type in list. The
# type list is not alphabetically-sorted.
# This determine the order in which you see
# files when you choose "Sort by file type"
# in BrowserII
ICONNAME "def_Src Ada" # OPTIONNAL: this the name of the default
# icon file name. These files should be in
# the "ENV:Sys/" directory, where WB 2.0 put
# its default icons. This will be used by
# AddIcon (In BrowserII and given cli command
# This string is returned by GetIconName()
# now come the decription of the file, if ANY condition below is
# not satisfied, the WhatIs.library think it is not this filetype.
# Exepte for OPNAMEPATTERN which is used for light WhatIs() (only
# based on the file name)
NAMEPATTERN "#?.ada" # OPTIONNAL: if given, the filename must match
# this pattern.
# it is mutualy exclusive with OPTNAMEPATTERN
OPTNAMEPATTERN "#?.ada" # OPTIONNAL: same as NAMEPATTERN but it is
# a DEEP scan may override it.
# it is mutualy exclusive with NAMEPATTERN
# NAMEPATTERN vs OPTNAMEPATTERN
# Imagine you are used to name all your image files with .ilbm
# extension. This way, a LIGHT scan will identify your ilbm files
# if your specify NAMEPATTERN "#?.ilbm". But ILBM files can also be
# internally recognized (using DEEP scan). If you specify
# NAMEPATTERN "#?.ilbm", all ILBM files not ending with .ilbm will
# not be recognized by whatis.library. But if you specify
# OPTNAMEPATTERN "#?.ilbm", the DEEP scan will override the (OPT)
# name pattern, and all ILBM files will be recognized.
# Now come the DEEP description. It is the heart of recognition
# process. You can specify numbers in decimal (begining with a
# digit), in hex (begining with $), in binary (begining with "%").
# Strings begin with a letter or with a quote '"'
# The search is done within the first (currently 484) few bytes of
# the file.
# All these conditions are optional, and are considered as TRUE
# by LIGHT scan.
COMPAREBYTE 12 $ABADCAFE # Test if the file contains the bytes
# $AB $AD $CA $FE at offset 12
COMPAREBYTE $23 "Hello" # Test if the file contains the string
# "Hello" (i.e the bytes $48 $65 $6c $6f)
# at offset $23 (decimal 35)
# in version 2 of WhatIs.library (only under KS2.x) you have an
# optionnal CASE modifier, this means "A" is different of "a".
SEARCHBYTE "Good" # Search for "Good" in the first bytes of file.
SEARCHBYTE $DEADBEEF # Search for bytes $DE $AD $BE $EF
SEARCHPATTERN [CASE] "ST-??:" # Search for "ST-??:" pattern in file.
MATCHPATTERN [CASE] 12 "ST-??:" # Search for "ST-??:" pattern in file
# at offset 12.
ENDTYPE # this marks the end of this FileType definition.
AskReparse is a small executable which ask whatis.library to reparse the S:FileTypes file. The file will be effectively parsed only if whatis.library is not used except by AskReparse at call time. Else, the parse is defered until whatis.library has no user.
@{b}3)@{ub}
Look in the WhatIsBase.h, you will find all you want.
How works WhatIs() ?
WhatIs is currently based on 2 methods: light or deep. The light
one is only based on the information you pass to it. In deep mode
WhatIs() open the file and scans the first few bytes (currently 488:
the size of an OldFileSystem data-block), so after loading these bytes
in memory, WhatIs() examine them to discover what type it is.
WhatIs() also examine the FileInfoBlock.
WhatIs() return a PRIVATE ULONG. You should not make any
assumption about how it is coded, because it may and WILL change in
future. You keep this ULONG and give it to the different functions of
whatis.library. All FileTypes must be first referenced by their
IDString "ILBM", "Text", "Exe, etc..., or returned by WhatIs().
For example you want to check if the file "Amiga" is an ILBM picture,
you should write:
ULONG Type, ILBMType;
Type = WhatIsTags("Amiga", WI_Deep, DEEPTYPE, TAG_DONE);